{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Creating discrete Bayesian Networks" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In this section, we show an example for creating a Bayesian Network in pgmpy from scratch. We use the cancer model (http://www.bnlearn.com/bnrepository/#cancer) for the example. The model structure is shown below.\n", "\n", "In pgmpy, the model structure and it's parametrization (CPDs) doesn't depend on each other. So, the workflow is to first define the model structure, then define all the parameters (CPDs) and then add these parameters to the model. These CPDs can later on be modified, removed, replaced without changing or defining a new model structure." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from IPython.display import Image\n", "\n", "Image(\"images/cancer.png\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Step 1: Define the model structure" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The `BayesianModel` can be initialized by passing a list of edges in the model structure. In this case, there are 4 edges in the model: Pollution -> Cancer, Smoker -> Cancer, Cancer -> Xray, Cancer -> Dyspnoea. " ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "from pgmpy.models import BayesianNetwork\n", "\n", "cancer_model = BayesianNetwork(\n", " [\n", " (\"Pollution\", \"Cancer\"),\n", " (\"Smoker\", \"Cancer\"),\n", " (\"Cancer\", \"Xray\"),\n", " (\"Cancer\", \"Dyspnoea\"),\n", " ]\n", ")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Step 2: Define the CPDs" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Each node of a Bayesian Network has a CPD associated with it, hence we need to define 5 CPDs in this case. In pgmpy, CPDs can be defined using the `TabularCPD` class. For details on the parameters, please refer to the documentation: https://pgmpy.org/_modules/pgmpy/factors/discrete/CPD.html" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "from pgmpy.factors.discrete import TabularCPD\n", "\n", "cpd_poll = TabularCPD(variable=\"Pollution\", variable_card=2, values=[[0.9], [0.1]])\n", "cpd_smoke = TabularCPD(variable=\"Smoker\", variable_card=2, values=[[0.3], [0.7]])\n", "cpd_cancer = TabularCPD(\n", " variable=\"Cancer\",\n", " variable_card=2,\n", " values=[[0.03, 0.05, 0.001, 0.02], [0.97, 0.95, 0.999, 0.98]],\n", " evidence=[\"Smoker\", \"Pollution\"],\n", " evidence_card=[2, 2],\n", ")\n", "cpd_xray = TabularCPD(\n", " variable=\"Xray\",\n", " variable_card=2,\n", " values=[[0.9, 0.2], [0.1, 0.8]],\n", " evidence=[\"Cancer\"],\n", " evidence_card=[2],\n", ")\n", "cpd_dysp = TabularCPD(\n", " variable=\"Dyspnoea\",\n", " variable_card=2,\n", " values=[[0.65, 0.3], [0.35, 0.7]],\n", " evidence=[\"Cancer\"],\n", " evidence_card=[2],\n", ")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Step 3: Add the CPDs to the model." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "After defining the model parameters, we can now add them to the model using `add_cpds` method. The `check_model` method can also be used to verify if the CPDs are correctly defined for the model structure." ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Associating the parameters with the model structure.\n", "cancer_model.add_cpds(cpd_poll, cpd_smoke, cpd_cancer, cpd_xray, cpd_dysp)\n", "\n", "# Checking if the cpds are valid for the model.\n", "cancer_model.check_model()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Step 4: Run basic operations on the model" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "False\n", "True\n" ] } ], "source": [ "# Check for d-separation between variables\n", "print(cancer_model.is_dconnected(\"Pollution\", \"Smoker\"))\n", "print(cancer_model.is_dconnected(\"Pollution\", \"Smoker\", observed=[\"Cancer\"]))" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'Pollution': {'Cancer', 'Dyspnoea', 'Pollution', 'Xray'}}" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Get all d-connected nodes\n", "\n", "cancer_model.active_trail_nodes(\"Pollution\")" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(Xray ⟂ Smoker, Pollution, Dyspnoea | Cancer)" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# List local independencies for a node\n", "\n", "cancer_model.local_independencies(\"Xray\")" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(Xray ⟂ Smoker, Pollution, Dyspnoea | Cancer)\n", "(Xray ⟂ Pollution, Dyspnoea | Smoker, Cancer)\n", "(Xray ⟂ Smoker, Dyspnoea | Pollution, Cancer)\n", "(Xray ⟂ Smoker, Pollution | Cancer, Dyspnoea)\n", "(Xray ⟂ Dyspnoea | Smoker, Pollution, Cancer)\n", "(Xray ⟂ Pollution | Smoker, Cancer, Dyspnoea)\n", "(Xray ⟂ Smoker | Pollution, Cancer, Dyspnoea)\n", "(Smoker ⟂ Pollution)\n", "(Smoker ⟂ Xray, Dyspnoea | Cancer)\n", "(Smoker ⟂ Xray, Dyspnoea | Pollution, Cancer)\n", "(Smoker ⟂ Dyspnoea | Xray, Cancer)\n", "(Smoker ⟂ Xray | Cancer, Dyspnoea)\n", "(Smoker ⟂ Dyspnoea | Pollution, Xray, Cancer)\n", "(Smoker ⟂ Xray | Pollution, Cancer, Dyspnoea)\n", "(Pollution ⟂ Smoker)\n", "(Pollution ⟂ Xray, Dyspnoea | Cancer)\n", "(Pollution ⟂ Xray, Dyspnoea | Smoker, Cancer)\n", "(Pollution ⟂ Dyspnoea | Xray, Cancer)\n", "(Pollution ⟂ Xray | Cancer, Dyspnoea)\n", "(Pollution ⟂ Dyspnoea | Smoker, Xray, Cancer)\n", "(Pollution ⟂ Xray | Smoker, Cancer, Dyspnoea)\n", "(Dyspnoea ⟂ Smoker, Pollution, Xray | Cancer)\n", "(Dyspnoea ⟂ Pollution, Xray | Smoker, Cancer)\n", "(Dyspnoea ⟂ Smoker, Xray | Pollution, Cancer)\n", "(Dyspnoea ⟂ Smoker, Pollution | Xray, Cancer)\n", "(Dyspnoea ⟂ Xray | Smoker, Pollution, Cancer)\n", "(Dyspnoea ⟂ Pollution | Smoker, Xray, Cancer)\n", "(Dyspnoea ⟂ Smoker | Pollution, Xray, Cancer)" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Get all model implied independence conditions\n", "\n", "cancer_model.get_independencies()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Loading example models" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To quickly try out different features, pgmpy also has the functionality to directly load some example models from the bnlearn repository." ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Nodes in the model: ['Pollution', 'Smoker', 'Cancer', 'Xray', 'Dyspnoea']\n", "Edges in the model: [('Pollution', 'Cancer'), ('Smoker', 'Cancer'), ('Cancer', 'Xray'), ('Cancer', 'Dyspnoea')]\n" ] }, { "data": { "text/plain": [ "[,\n", " ,\n", " ,\n", " ,\n", " ]" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from pgmpy.utils import get_example_model\n", "\n", "model = get_example_model(\"cancer\")\n", "print(\"Nodes in the model:\", model.nodes())\n", "print(\"Edges in the model:\", model.edges())\n", "model.get_cpds()" ] } ], "metadata": { "anaconda-cloud": {}, "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.10" } }, "nbformat": 4, "nbformat_minor": 1 }